package day9;
//synchronized实现多线程购买商品
//假设两个线程 都想购买100个商品
//商品的总数只有100个
//而且两个线程必须轮流购买
//锁对象.wait() 当线程等待 需要别人唤醒 释放对象锁
//锁对象.notify() 唤醒随机一个线程
//锁对象.notifyAll() 唤醒全部线程
public class Demo4 {
    int sum = 100;
    public synchronized void buy(){//高新分店
        String name = Thread.currentThread().getName();
        if (sum>0){
            sum--;
            System.out.println(name+"购买了商品,剩余："+sum+"个");
        }
        try {
            this.notifyAll();
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Demo4 d = new Demo4();
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                d.buy();
            }
        },"陈毓坚").start();
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                synchronized (d){
                    String name = Thread.currentThread().getName();
                    if (d.sum>0){
                        //青山湖分店
                        d.sum--;
                        System.out.println(name+"购买了商品,剩余："+d.sum+"个");
                        try {
                            d.notifyAll();
                            d.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        },"钟元").start();
    }
}
